2.4 基本类型

清晰完备的预定义基础类型,使得开发跨平台应用时无须过多考虑符号和长度差异。

支持八进制、十六进制以及科学记数法。标准库math定义了各数字类型的取值范围。

import( 
    "fmt" 
    "math" 
) 
  
func main() { 
   a,b,c:=100,0144,0x64
  
   fmt.Println(a,b,c) 
   fmt.Printf("0b%b, %#o, %#x\n",a,a,a) 
  
   fmt.Println(math.MinInt8,math.MaxInt8) 
}
 

输出:

100 100 100
0b1100100,0144,0x64
  
-128 127

标准库strconv可在不同进制(字符串)间转换。

import"strconv" 
  
func main() { 
   a, _ :=strconv.ParseInt("1100100",2,32) 
   b, _ :=strconv.ParseInt("0144",8,32) 
   c, _ :=strconv.ParseInt("64",16,32) 
  
   println(a,b,c) 
  
   println("0b" +strconv.FormatInt(a,2)) 
   println("0" +strconv.FormatInt(a,8)) 
   println("0x" +strconv.FormatInt(a,16)) 
}
 

输出:

100 100 100
0b1100100
0144
0x64

使用浮点数时,须注意小数位的有效精度,相关细节可参考IEEE-754标准。

func main() { 
   var a float32=1.1234567899      // 注意:默认浮点类型是float64
   var b float32=1.12345678
   var c float32=1.123456781
  
   println(a,b,c) 
   println(a==b,a==c) 
   fmt.Printf("%v%v, %v\n",a,b,c) 
}
 

输出:

+1.123457e+000+1.123457e+000+1.123457e+000
true true
1.1234568 1.1234568,1.1234568

别名

在官方的语言规范中,专门提到两个别名。

byte      alias for uint8
rune      alias for int32

别名类型无须转换,可直接赋值。

func test(x byte) { 
   println(x) 
} 
  
func main() { 
   var a byte=0x11
   var b uint8=a
   var c uint8=a+b
  
   test(c) 
}
 

但这并不表示,拥有相同底层结构的就属于别名。就算在64位平台上int和int64结构完全一致,也分属不同类型,须显式转换

func add(x,y int)int{ 
   return x+y
} 
  
func main() { 
   var x int=100
   var y int64=x // 错误:cannot use x(type int)as type int64 in assignment
  
   add(x,y)       // 错误:cannot use y(type int64)as type int in argument to add
}